% !TeX spellcheck = en_US
\chapter{QUADRO TEÓRICO}

\par Neste capítulo serão discutidas as técnicas, metodologias e tecnologias que serão utilizadas no vimento deste trabalho.

\section{Iconix}

\par O ICONIX, segundo \citeonline{rosenberg_iconix_process}, foi criado em 1993 a partir de um resumo das melhores técnicas de desenvolvimento de \textit{software} utilizando como ferramenta de apoio a \textit{Unified Modeling Language} - UML\footnotemark[3] -. Esta metodologia é mantida pela empresa ICONIX \textit{Software Engineering} e seu principal idealizador é Doug Rosenberg.

%Nota a respeito da sigla UML
\footnotetext[3]{O termo \textit{Unified Modeling Language} será referenciado pela sigla UML a partir deste ponto do trabalho.}


\par Para \citeonline{rosenberg_scott_use_case_driven_object_modeling_with_uml}, o ICONIX possui como característica ser iterativo e incremental, somado ao fato de ser adequado ao padrão UML auxiliando, assim, o desenvolvimento e a documentação do sistema.

\par Atualmente, existem diversas metodologias de desenvolvimento de \textit{software} disponíveis. Contudo, o ICONIX, em especial, será utilizado para auxiliar no processo de desenvolvimento deste trabalho pois, segundo
\citeonline{silva_videira_uml_metodologias_ferramentas_case}, esta metodologia nos permite gerar a documentação necessária para nortear o desenvolvimento de um projeto acadêmico.

\par De acordo com \citeonline{rosenberg_stephens_use_case_driven_object_modeling_with_uml}, os processos do ICONIX consistem em gerar alguns artefatos que correspondem ao modelo dinâmico e estático de um sistema e estes são elaborados e desenvolvidos de forma incremental e em paralelo, possibilitando ao analista dar maior ênfase no desenvolvimento do sistema do que na documentação do mesmo. A figura, a seguir, apresenta uma visão geral dos componentes do ICONIX.

% Imagem do Iconix
\begin{figure}[h!]
	\centerline{\includegraphics[scale=0.95]{./imagens/visao_geral_iconix.png}}
	\caption[Uma visão geral do ICONIX e seus componentes.]
	{Uma visão geral do ICONIX e seus componentes. \textbf{Fonte:} \cite{rosenberg_scott_use_case_driven_object_modeling_with_uml}}
	\label{fig:exemplo1}
\end{figure}

\newpage %Pular pagina para que o texto fica abaixo da imagem na nova pagina
\par Justamente por esta praticidade disponibilizada pelo ICONIX é que empregaremos este processo para o desenvolvimento deste projeto, pois por meio dele é possível obter produtividade no desenvolvimento do \textit{software} ao mesmo tempo em que alguns artefatos são gerados, unindo o aspecto de abrangência e agilidade.


\section{Teoria dos Grafos}

\par A teoria dos grafos foi criada pelo matemático suiço \textit{Leonhard} Euler no século 18 com o propósito de solucionar um antigo problema, conhecido como as 7 pontes de \textit{Königsberg} \cite{harju_graph_theory}.

\par \textit{Königsberg} era uma antiga cidade medieval cortada pelo rio \textit{Pregel} dividindo-a em 4 partes interligadas por 7 pontes. Ela era localizada na antiga Prússia, hoje, território Russo. O problema mencionado anteriormente consistia basicamente em atravessar toda a cidade, visitando todas as partes e utilizar todas as pontes desde que não repetisse uma das quatro partes ou uma das 7 pontes. A figura 2 ilustra o problema mencionado.

% Imagem do problema das 7 pontes da teoria dos grafos
\begin{figure}[h!]
	\centerline{\includegraphics[height=0.26\textheight,width=0.8\textwidth]{./imagens/Konigsberg_7_bridges.jpg}}
	\caption[O problema das 7 pontes de \textit{Königsberg} ]
	{O problema das 7 pontes de \textit{Königsberg}. \textbf{Fonte:} \cite{paoletti_seven_bridges_konigsberg}}
	\label{fig:exemplo1}
\end{figure}

\par De acordo com \citeonline{bruggen_learning_neo4j}, para tentar solucionar o problema, Euler utilizou uma abordagem matemática ao contrário dos demais que tentaram utilizar a força bruta para solucionar tal problema, desenhando N números de diferentes possibilidades de rotas. Euler mudou o foco e passou a dar mais atenção ao número de pontes e não as partes da cidade. Através desta observação, foi possível perceber que realizar tal tarefa seria impossível, pois de acordo com sua teoria seria necessário possuir no mínimo mais uma ponte, uma vez que, o número de pontes era ímpar, não sendo possível realizar um caminho único e sem repetição. Desta forma, obteve-se a solução para este problema e criou-se o primeiro grafo no mundo.

\par \citeonline[p. 16]{rocha_algoritmos_particionamento_banco_dados_orientado_grafos} afirma que: 

\begin{citacao}
	Um \textit{grafo G = (V,E)} consiste em um conjunto finito \textit{V} de vértices e um conjunto finito \textit{E} de arestas onde cada elemento \textit{E} possui um par de vértices que estão conectados entre si e pode ou não possuir um peso \textit{P}.
\end{citacao}

\par Esta é a definição básica de um grafo. A partir desta definição, é possível identificar, no problema mencionado anteriormente, os vértices que neste caso são as pontes e as arestas que por sua vez são as partes da cidade.

\par Segundo \citeonline{bondy_murty_graph_theory_with_applications}, muitas situações do mundo real podem ser descritas através de um conjunto de pontos conectados por linhas formando assim um grafo, como um centro de comunicações e seus links, ou os pessoas e seus amigos, ou uma troca de emails entre pessoas, entre outras. Isto é possível pois, de acordo com \citeonline{rocha_algoritmos_particionamento_banco_dados_orientado_grafos} existem muitos problemas atualmente que podem ser mapeados para uma estrutura genérica possibilitando assim utilizar a teoria de grafos para tentar solucioná-los.

%BANCA_QUALIFICACAO. Comentado este parágrafo, porém o mesmo retornará para a banca de qualificação
%\par A figura 3 demostra de maneira visual um grafo, conforme ideia de \citeonline{bondy_murty_graph_theory_with_applications}, utilizando como exemplo o seguinte grafo \textit{G} = \{a, b, c, d, e, f, g, h\} e suas respectivas arestas \textit{E}$_g$ = \{(a, b), (a, h), (a, e), (b, f), (c, e), (c, d), (c, g), (d, e), (d, h), (d, g), (f, h)\}, sendo que os vértices serão representados por círculos e as arestas que os interligam por linhas.

%subscrito $_CARCTER_DESEJADO$

% Imagem do grafo simples - VOLTAR NA BANCA DE QUALIFICACAO
%\begin{figure}[h!]
	%\centerline{\includegraphics[scale=0.77]{./imagens/simple_graph.png}}
	%\caption[Ilustração de uma representação gráfica de um simples grafo]
	%{Ilustração de uma representação gráfica de um simples grafo. \textbf{Fonte:} \cite{rocha_algoritmos_particionamento_banco_dados_orientado_grafos}}
	%\label{fig:exemplo1}
%\end{figure}

%\newpage %pular uma folha para que imagem fique na posição correta de acordo com a Joelma

%BANCA_QUALIFICACAO. Comentado este parágrafo, porém o mesmo retornará para a banca de qualificação
%\par \citeonline{ruohonen_graph_theory} afirma que os grafos podem ser gerados com a possibilidade de permitir \textit{loops}\footnotemark[4] e arestas paralelas ou multiplas entre os vértices, obtendo um \textit{multigraph}. A figura 4 ilustra um simples \textit{multigraph}.

%\footnotetext[4]{\textit{loops} - Uma aresta que interliga o mesmo vértice.}

% Imagem de um multigraph - VOLTAR NA BANCA DE QUALIFICACAO
%\begin{figure}[h!]
	%\centerline{\includegraphics[scale=0.9]{./imagens/multigraph_example.png}}
	%\caption[Ilustração de uma representação gráfica de um \textit{multigraph}]
	%{Ilustração de uma representação gráfica de um \textit{multigraph}. \textbf{Fonte:} Adaptado de \cite{harju_graph_theory}}
	%\label{fig:exemplo1}
%\end{figure}

%BANCA_QUALIFICACAO. Comentado este parágrafo, porém o mesmo retornará para a banca de qualificação
%\par Para \citeonline{harju_graph_theory}, os grafos podem ser direcionados (\textit{dígrafo}) ou não direcionados. Os  direcionados são aqueles cujos vértices ligados a uma aresta são ordenados e permitem que uma aresta que conecta os vértices \textit{x} e \textit{y} seja representada apenas de uma forma, sendo ela \{x, y\} ou \{y, x\}, ao contrário dos não direcionados que, para este mesmo caso, pode ser representado por ambas as formas \cite{rocha_algoritmos_particionamento_banco_dados_orientado_grafos}. A figura 5 demonstra um grafo direcionado.

% Imagem de um grafo direcionado - VOLTAR NA BANCA DE QUALIFICACAO
%\begin{figure}[h!]
	%\centerline{\includegraphics[scale=0.6]{./imagens/simple_digraph_graph.png}}
	%\caption[Imagem de uma representação gráfica de um grafo direcionado]
	%{Imagem de uma representação gráfica de um grafo direcionado. \textbf{Fonte:} http://www.cs.hmc.edu/~keller/courses/cs60/s98/examples/acyclic/}
	%\label{fig:exemplo1}
%\end{figure}

%\newpage %pular uma folha para que imagem fique na posição correta de acordo com a Joelma
\par Esta teoria foi escolhida para ser utilizada neste trabalho pois, como mencionado anteriormente é possível descrever várias situações do mundo real, utilizando-a. E como a mesma é muito bem aplicada à redes sociais, inclusive grandes empresas desta área já a utilizam, ela será  utilizada para auxiliar no desenvolvimento deste trabalho.

\section{Tecnologias}

\par Nesta seção serão abordadas as linguagens de programação e as tecnologias que serão utilizadas para o desenvolvimento deste trabalho.

\subsection{Banco de dados}

\par A expressão Banco de dados teve origem a partir do termo inglês \textit{Databanks}, que foi substituído, mais tarde, pela palavra \textit{Databases} (Base de dados)  por possuir um significado mais apropriado \cite {setzer_silva_banco_dados_aprenda_o_que_sao_melhore_conhecimento}.

\par De acordo com \citeonline{date_introducao_sistemas_bancos_dados}, um banco de dados é uma coleção de dados persistentes, usada pelos sistemas de aplicação em uma determinada empresa. Sendo assim, um banco de dados é um local onde são armazenados os dados necessários para manter as atividades de determinadas organizações.

\par Um banco de dados possui, implicitamente, as seguintes propriedades: representa aspectos do mundo real, é uma coleção lógica de dados que possuem um sentido próprio e é projetado e preenchido com dados para atender uma necessidade específica. O tamanho do banco de dados pode ser variável, desde que ele atenda às necessidades dos interessados em seu conteúdo \cite{elmasri_navathe_sistemas_banco_dados}.


\subsubsection{Tipos de bancos de dados}

\par A escolha do banco de dados que será utilizado em um projeto é uma decisão importante e que deve ser tomada na fase de planejamento, pois determina características da futura aplicação, como a integridade dos dados, o tratamento de acesso de usuários, a forma de realizar uma consulta, o desempenho e a performance . Portanto, essa decisão deve ser bem analisada, levando em consideração o tipo de software e no ambiente de produção que será utilizado.

\par A seguir, são demonstrados os principais modelos de banco de dados, abordando suas características.


\subsection{Banco de dados relacionais}

\par O modelo de banco de dados relacional foi introduzido em 1970, por Edgar Frank Codd, em uma publicação com o título: “A relational model of data for large shared data banks”, na revista \textit{Association for Computing Machinery} (ACM). Essa publicação demonstrou como tabelas podem ser usadas para representar objetos do mundo real e como os dados podem ser armazenados para os objetos. Neste conceito, a integridade dos dados foi levada mais a sério do que em qualquer modelo de banco de dados antes visto. A partir desta publicação, surgiram muitos banco de dados que passaram a utilizar este conceito e se tornaram muito utilizados no desenvolvimento de aplicações
\cite{matthew_stones_beginning_databases_with_postgresql}.

\par Segundo \citeonline{matthew_stones_beginning_databases_with_postgresql}, conceito é baseado na teoria reacional da matemática e por isso há uma grande flexibilidade para o acesso e a manipulação de dados que são gravados no banco de dados.  Utiliza-se técnicas simples, como normalização na modelagem do banco de dados, criando várias tabelas relacionadas, que servem como base para consultas usando uma linguagem de consulta quase padronizada, a \textit{Structured Query Language} – SQL\footnotemark[5] -.

\footnotetext[5]{O termo \textit{Structured Query Language} a partir deste ponto do trabalho será referenciado pela sigla SQL.}

\par Ainda \citeonline{matthew_stones_beginning_databases_with_postgresql}, um banco de dados relacional contém relações (tabelas) com atributos (colunas) e tuplas (linhas). Todo atributo possui um tipo de dado predefinido, uma tupla representa um conjunto de dados contendo um valor para cada atributo da linha e as tabelas são relacionadas através de chaves.

\par A utilização de banco de dados relacionais geraram a necessidade de dividir os dados agregados utilizados na aplicação em várias relações conforme as regras da normalização. Para recuperar o mesmo dado agregado são necessárias consultas utilizando \textit{joins}, uma operação que dependendo do tamanho das relações e da quantidade de dados pode não ser tão eficiente. Nos casos em que se precisa obter uma resposta rápida de um sistema isso pode ser uma desvantagem \cite{sadalage_fowler_nosql_distilled_brief_guide}.

\par A figura 6 ilustra bem esta situação de divisão de um agregado e as suas relações resultantes.

% Imagem do exemplo de join
\begin{figure}[h!]
	\centerline{\includegraphics[scale=0.8]{./imagens/example_joins_sadalage.png}}
	\caption[Agregado no UI é conjunto de várias tuplas de várias tabelas]
	{Agregado no UI é conjunto de várias tuplas de várias tabelas. \textbf{Fonte:} \citeonline[p. 29]{sadalage_fowler_nosql_distilled_brief_guide}}
	\label{fig:exemplo1}
\end{figure}

\newpage
\par Este foi um dos fatores determinantes que motivaram a criação de novas tecnologias, a fim de sanar o problema mencionado acima. A partir desta motivação foram desenvolvidos novos modelos de banco de dados, que serão apresentados a seguir.


\subsection{Banco de dados NoSQL}

\par A expressão NoSQL é um termo não definido claramente. Ela foi ouvida pela primeira vez em 1998 como um nome para o banco de dados relacional de Carlo Strozzi, que assim o nomeou por não fornecer uma SQL-API. O mesmo termo foi usado como nome do evento NoSQL Meetup em 2009, que teve como objetivo a discussão sobre sistemas de bancos de dados distribuídos.

\par Devido a explosão de conteúdos na \textit{web} no início do século XXI, houve-se a necessidade de substituir os bancos de dados relacionais por bancos que oferececem maior capacidade de otimização e performance, a fim de suportar o grande volume de informações eminentes a esta mudança \cite{bruggen_learning_neo4j}.

\par \citeonline[p. 27]{rocha_algoritmos_particionamento_banco_dados_orientado_grafos} afirma que NoSQL é "um acrônimo para Not only SQL, indicando que esses bancos não usam somente o recurso de Structured Query Language (SQL), mas outros recursos que auxiliam no armazenamento e na busca de dados em um banco  não relacional".

\par Segundo \citeonline{bruggen_learning_neo4j}, os banco de dados NoSQL podem ser categorizados de 4 maneiras diferentes, são elas: \textit{Key-Value stores}, \textit{Column-Family stores}, \textit{Document stores} e \textit{Graph Databases}.

%\begin{itemize}
%\item \textit{Key-Value stores};
%\item \textit{Column-Family stores};
%\item \textit{Document stores};
%\item \textit{Graph Databases}.
%\end{itemize}

\par De acordo com \citeonline{bruggen_learning_neo4j}, o banco de dados orientado a grafo pertence a categoria NoSQL, contudo, ele possui particularidades que o torna muito diferente dos demais tipos de bancos de dados NoSQL. A seguir, será descrito com maiores detalhes o banco de dados orientado a grafos Neo4j.


\subsection{Neo4j}

\par O Neo4j foi criado no início do século XXI por desenvolvedores que queriam resolver um problema em uma empresa de mídias. Porém, eles não obtiveram êxito ao tentar resolver tal problema utilizando as tecnologias tradicionais, portanto, decidiram arriscar e criar algo novo. A princípio, o Neo4j não era um sistema de gerenciamento de banco de dados orientado a grafos como é conhecido nos dias atuais. Ele era mais parecido com uma \textit{graph library} (biblioteca de grafo) na qual as pessoas poderiam usar em seus projetos \cite{bruggen_learning_neo4j}.

\par De acordo com \citeonline{bruggen_learning_neo4j}, inicialmente ele foi desenvolvido para ser utilizado em conjunto com alguns bancos de dados relacionais como MySQL e outros, com a intenção de criar uma camada de abstração dos dados em grafos. Mas com o passar dos anos, os desenvolvedores decidiram tirar o Neo4j da estrutura dos bancos relacionais e criar sua própria estrutura de armazenamento em grafos.

\par O Neo4j, como vários outros, também é um projeto de sistema de gerenciamento de banco de dados NoSQL de código fonte aberto. De acordo com \citeonline{rocha_algoritmos_particionamento_banco_dados_orientado_grafos}, NoSQL é um acrônimo para \textit{Not Only SQL}, isto significa que estes tipos de banco de dados utilizam não somente os recursos de SQL, mas também outros recursos a fim de obter a melhor performance possível.

\par Segundo \citeonline{robinson_webber_eifrem_graph_databases}, os bancos de dados orientados a grafos possuem como diferencial a sua performance, agilidade e flexibilidade. Entretanto, a performance é o que mais se destaca entre eles, pois, a maneira como eles armazenam e realizam buscas no banco de dados são diferentes dos bancos de dados convencionais. Primeiramente, este tipo de banco de dados não utiliza tabela, ele armazena os dados em vértices e arestas. Isto permite realizar buscas extremamente velozes através de \textit{traversals} (travessias), um vez que estas implementam algorítmos para otimizar tais funcionalidades, evitando assim o uso de \textit{joins} complexos, tornando-o tão veloz.

\par \citeonline[p. 2]{neo4j_team_manual} afirma que:

\begin{citacao}
	\textit{A single server instance can handle a graph of billions of nodes and relationships. When data throughput is insufficient, the graph database can be distributed among multiple servers in a high availability configuration.}\footnotemark[6]
\end{citacao}

\footnotetext[6]{Um único servidor pode manipular um grafo de bilhões de nós e relacionamentos. Quando a taxa de transferência de dados é insuficiente, o banco de dados orientado a grafo pode ser distribuído entre vários servidores em uma configuração de alta disponibilidade.}

\par Com estas informações, é possível mensurar o quanto o Neo4j pode ser rápido e robusto, sendo possível, até mesmo distribuí-lo a fim de obter uma melhor configuração, organização e facilidade de manutenção.

%BANCA_QUALIFICACAO. Comentado este parágrafo, porém o mesmo retornará para a banca de qualificação
%\par Segundo \citeonline{neo4j_team_manual}, o Neo4j é composto por nós (vértices), relacionamentos (arestas) e propriedades. Os relacionamentos são responsáveis por organizar os nós. É possível realizar as buscas e/ou alterações no Neo4j de duas formas diferentes. Sendo a primeira através do \textit{framework Cypher Query Language}, que é uma \textit{query language} para banco de dados orientado a grafos muito próxima da linguagem humana. cuja sua descrição completa será apresentada a seguir. A segunda é o \textit{framework Traversal} que utiliza o \textit{Cypher} de maneira interna para navegar pelo grafo.

%BANCA_QUALIFICACAO. Comentado este parágrafo, porém o mesmo retornará para a banca de qualificação
%\par Há duas formas de executar o Neo4j, segundo \citeonline{robinson_webber_eifrem_graph_databases}. A primeira é conhecida como \textit{Server} e a segunda \textit{Embedded}. O modo \textit{Server} é utilizado principalmente em \textit{web-service} em conjunto com a API REST. Já no modo \textit{Server} o banco de dados é executado embarcado à aplicação Java, este modo será utilizado por este trabalho.

%BANCA_QUALIFICACAO. Comentado este parágrafo, porém o mesmo retornará para a banca de qualificação
%\par Conforme \citeonline{neo4j_team_manual}, o Neo4j possui suporte as transações \textit{ACID} (com automação, consistência, isolamento e durabilidade).

\par Por ser um banco de dados orientado a grafo bastante robusto, seguro e possuir uma documentação de fácil entendimento, além, é claro, de possuir um baixo custo de implantação devido a sua licença \textit{open source} este banco de dados foi escolhido para ser utilizado neste trabalho.


\subsection{\textit{Cypher Query Language}}

\par O \textit{Cypher Query Language} é uma \textit{graph database query language} específica para o banco Neo4j. Ele foi criado devido a necessidade de manipular os dados e realizar buscas em grafos de uma forma mais simples, uma vez que, não é necessário escrever \textit{traversals} (\textit{travessias}) para navegar pelo grafo. \cite{neo4j_team_manual}.


\par \citeonline{robinson_webber_eifrem_graph_databases}, afirmam que, o \textit{Cypher} foi desenvolvido para ser uma \textit{query language} que utiliza uma linguagem formal, permitindo a um ser humano entendê-la. Desta forma, qualquer pessoa envolvida no projeto é capaz de compreender as consultas realizadas no banco de dados. 

%BANCA_QUALIFICACAO. Comentado este parágrafo, porém o mesmo retornará para a banca de qualificação
%\par Segundo \citeonline{neo4j_team_manual}, o \textit{Cypher} foi inspirado e uma série de abordagens e construído sob algumas práticas já estabelecidas, inclusive a SQL. Por este motivo, é possível notar que ele utiliza algumas palavras reservadas que são comuns na SQL como \textit{WHERE} e \textit{ORDER BY}.

%BANCA_QUALIFICACAO. Comentado este parágrafo, porém o mesmo retornará para a banca de qualificação
%\par De acordo com \citeonline{neo4j_team_manual}, o \textit{Cypher} é composto por algumas cláusulas, dentre elas, se destacam:

%%BANCA_QUALIFICACAO. Comentado estes itens, porém os mesmos retornarão para a banca de qualificação
%\begin{itemize}
	%\item \textit{START}: Define um nó inicial para a busca.
	%\item \textit{MATCH}: Define o padrão de correspondência entre os nós.
	%\item \textit{CREATE}: Cria nós e relacionanemtnos.
	%\item \textit{WHERE}: Define um critério de busca.
	%\item \textit{RETURN}: Define quais nós e/ou atributos devem ser retornados da \textit{query} realizada. 
%\end{itemize} 

\par Outras \textit{Query Languages} existem, inclusive com suporte ao Neo4j, porém devido as vantagens apresentadas acima somada ao fato que ele possui uma curva de aprendizado menor e é excelente para lhe oferecer uma base a respeito de grafos, neste este \textit{framework} será utilizado para realizar as tarefas referentes ao banco de dados.


\subsection{Java}

\par Segundo \citeonline{schildt_java_complete_reference}, a primeira versão da linguagem Java foi criada por James Gosling, Patrick Naughton, Chris Warth, Ed Frank e Mike Sheridan na \textit{Sun Microsystems} em 1991 e denominada "Oak" cujo seu principal foco era a interatividade com a TV. Mais tarde, em 1995, a \textit{Sun Mycrosystems} renomeia esta linguagem e anuncia publicamente a tecnologia Java, focando nas aplicações \textit{web}, que em pouco tempo e devido a grande ascensão da internet, cresceu e se mantém em constante evolução até os dias atuais.

\par De acordo com a \citeonline{oracle_about_java_technology}, a tecnologia Java não é apenas uma linguagem, mas também uma plataforma, que teve como modelo uma outra linguagem, o C++ que, por sua vez foi derivada da linguagem C. O C++ e o Java possuem em comum o conceito de orientação a objeto.

%BANCA_QUALIFICACAO. Comentado este parágrafo, porém o mesmo retornará para a banca de qualificação
%\par Para \citeonline{schildt_java_complete_reference}, o paradigma de orientação a objetos foi criado devido as limitações que o conceito estrutural apresentava quando era utilizado em projetos de grande porte, dificultando o desenvolvimento e manutenção dos mesmos. Este paradigma possibilita ao desenvolvedor aproximar o mundo real ao desenvolvimento de \textit{software}, deixando os objetos do mundo real semelhantes a seus respectivos objetos da computação. Possibilitando ao desenvolvedor modelar seus objetos de acordo com suas necessidades \cite{tcc_univas_faria_aspectj_programacao_orientada_aspecto_java}.

\par Retomando a ideia da \citeonline{oracle_about_java_technology}, uma das vantagens da tecnologia Java sob as demais é o fato de ela ser multiplataforma, possibilitando ao desenvolvedor escrever o código apenas uma vez e este, ser executado em qualquer plataforma inclusive em hardwares com menor desempenho. Isto é possível, pois, para executar um programa em Java é necessário possuir uma \textit{Java Virtual Machine} - JVM\footnotemark[8] - instalada no computador. A JVM compreende e executa apenas \textit{bytecodes} e estes por sua vez são obtidos através do processo de compilação do código escrito em Java.

%Nota a respeito da sigla JVM
\footnotetext[8]{O termo \textit{Java Virtual Machine} será referenciado pela sigla JVM a partir deste ponto do trabalho.}

\par Todo programa que utiliza Java necessita passar por algumas etapas essenciais. Conforme ilustrado na figura 7, o código é escrito em arquivo de texto com extensão .java, após isto ele será compilado e convertido para um arquivo com extensão .class, cujo o texto é transformado em \textit{bytecodes}\footnotemark[9]. Este arquivo com extensão .class é interpretado pela JVM que é responsável por executar todo o código do programa.

%Nota a respeito de bytecodes
\footnotetext[9]{\textit{Bytecode} é o código interpretado pela JVM. Ele é obtido através do processo de compilação de um programa java como mencionado anteriormente.}

% Imagem do Processo de compilação do Java
\begin{figure}[h!]
	\centerline{\includegraphics[scale=1]{./imagens/processo_compilacao_java.png}}
	\caption[Uma visão geral do processo de desenvolvimento de software.]
	{Uma visão geral do processo de desenvolvimento de software. \textbf{Fonte:} \cite{oracle_about_java_technology}}
	\label{fig:exemplo1}
\end{figure}

\par Por todas as vantagens descritas acima, além do banco de dados Neo4j, cujo sua descrição será apresentada posteriormente, utilizar como linguagem principal o Java, neste projeto será empregado o uso desta tecnologia


\subsection{Tomcat 7}

\par O Tomcat é uma aplicação \textit{container}, capaz de hospedar aplicações \textit{web} baseadas em Java. A princípio ele foi criado para executar \textit{servlets}\footnotemark[10] e \textit{JavaServer Pages} - JSP\footnotemark[11] -. Inicialmente ele era parte de um sub projeto chamado \textit{Apache-Jakarta}, porém, devido ao seu sucesso ele foi transferido e hoje, ele é responsabilidade de um grupo de voluntários da comunidade \textit{open source} do Java \cite{vukotic_goodwill_apache_tomcat_7}.

\footnotetext[10]{\textit{Servlet} - É a tecnologia capaz de gerar páginas dinâmicas na plataforma Java.}

\footnotetext[11]{O termo \textit{JavaServer Pages} será referenciado pela sigla JSP a partir deste ponto do trabalho.}

\par Segundo a \citeonline{apache_about_tomcat}, o Tomcat é um software que possui seu código fonte aberto e disponibilizado sob a Apache Lincese version 2. Isto o fez se tornar uma das aplicações \textit{containers} mais utilizadas por desenvolvedores.

\par \textit{Containers} são aplicações que são executadas em servidores e possuem a capacidade de hospedar aplicações desenvolvidas em Java web. O servidor ao receber uma requisição do cliente, entrega esta, não ao \textit{servlet}  e sim ao \textit{container} no qual o \textit{servlet} é distribuído, o \textit{container} por sua vez entrega ao \textit{servlet} as requisições e respostas HTTP\footnotemark[12] e iniciam os métodos necessários do \textit{servlet} de acordo com o tipo de requisição realizada pelo cliente \cite{basham_sierra_bates_use_cabeca_servlets_jsp}.

\footnotetext[12]{HTTP - \textit{Hypertext Transfer Protocol}  é o protocolo de transferência de dados mais utilizado na rede mundial de computadores.}

%BANCA_QUALIFICACAO. Comentado este parágrafo, porém o mesmo retornará para a banca de qualificação
%\par \citeonline{brittain_darwin_apache_tomcat_2nd_edition} afirmam que o Tomcat foi desenvolvido utilizando a linguagem de programação Java, sendo necessário possuir uma versão do Java SE \textit{Runtime Environment} - JRE - instalado e atualizado para executá-lo.

%BANCA_QUALIFICACAO. Comentado este parágrafo, porém o mesmo retornará para a banca de qualificação
%\par De acordo com  \citeonline{laurie_laurie_apache_the_definitive_guide}, o Tomcat é responsável por realizar a comunicação entre a aplicação e o servidor Apache através do uso de \textit{socket} do Apache e da JVM.

\par Assim como outros containers, \citeonline{basham_sierra_bates_use_cabeca_servlets_jsp} afirmam que o tomcat oferece gerenciamento de conexões sockets, suporta multithreads, ou seja, ele cria uma nova thread para cada requisição realizada pelo cliente e gerencia o acesso aos recursos do servidor, além de outras tarefas.

\par O Tomcat, em especial, foi escolhido para ser utilizado neste trabalho, pois o objetivo é desenvolver uma aplicação \textit{web} e para hospedá-la em um servidor, uma aplicação \textit{container} se faz necessária. Por este motivo, e somado a sua facilidade de configuração, além das vantagens acima descritas tal decisão foi tomada.


\subsection{JavaServer Faces}

\par Segundo \citeonline{faria_java_ee_7_jsf_primefaces_cdi}, a tecnologia \textit{JavaServer Faces} - JSF\footnotemark[13] - foi definida pelo JCP (\textit{Java Community Process}), tornando-a um padrão de desenvolvimento, facilitando assim o trabalho dos desenvolvedores de software.

\footnotetext[13]{O termo \textit{JavaServer Faces} será referenciado pela sigla JSF a partir deste ponto do trabalho.}

\par \citeonline{bergsten_javaserver_faces} afirma que o JSF é um \textit{framework server-side} baseado em componentes \textit{web}, cuja principal função é abstrair os detalhes de manipulação dos eventos e organização dos componentes na página \textit{web}. Por meio dele é possível desenvolver páginas mais sofisticadas de forma simples, abstraindo inclusive, o tratamento de requisições e respostas. Isto permite ao desenvolvedor focar-se no \textit{back-end} da aplicação, ou seja, na lógica, e não se preocupar com detalhes a respeito de requisições e respostas HTTP\footnotemark[13] e como obter as informações recebidas e/ou enviadas através deste protocolo.

\par De acordo com \citeonline{oracle_javaserver_faces_technology_overview}, o JSF é de fácil aprendizado e utilização, pois possui sua arquitetura claramente definida, sendo dividida entre a lógica da aplicação e apresentação. Esta divisão é possível pois ele utiliza o padrão de projeto \textit{Model-View-Controller} - MVC\footnotemark[14] -, tornando-o um importante \textit{framework} para desenvolvimento de aplicações utilizando a plataforma Java \textit{Web} e com alta demanda de procura no mercado.

\footnotetext[14]{O termo \textit{Model-View-Controller} será referenciado pela sigla MVC a partir deste ponto do trabalho.}

%BANCA_QUALIFICACAO. Comentado este parágrafo, porém o mesmo retornará para a banca de qualificação
%\par Segundo \citeonline{gamma_helm_johnson_vlissides_design_patterns_elements_reusable_object_oriented_software}, o padrão de projeto MVC é dividido em três partes. O \textit{Model} é a lógica da aplicação, a \textit{View} é camada de apresentação e por último o \textit{Controller} é responsável por definir a interface entre a lógica e a apresentação. Portanto, todo tipo de requisição ou resposta deve ser obrigatoriamente enviada ao \textit{Controller}, que, por sua vez encaminhará para a camada de visão ou de lógica. A figura 8 demonstra um exemplo do modelo MVC utilizando o JSF.

% Imagem do modelo MVC usando JSF - VOLTAR PARA A BANCA DE QUALIFICACAO
%\begin{figure}[h!]
	%\centerline{\includegraphics[scale=0.5]{./imagens/jsf_using_mvc.jpg}}
	%\caption[Imagem de demonstração do Modelo MVC]
	%{Imagem de demonstração do Modelo MVC \textbf{Fonte:} http://www.javabeat.net/jsf-2/}
	%\label{fig:exemplo1}
%\end{figure}

%BANCA_QUALIFICACAO. Comentado este parágrafo, porém o mesmo retornará para a banca de qualificação
%\par Ao utilizar o JSF, toda e qualquer interação que o usuário realizar com a aplicação será executada por uma \textit{servlet} chamada \textit{Faces Servlet}. Ela é a responsável por receber tais requisições da camada de visão e redirecioná-las a lógica da aplicação e, posteriormente, enviar a resposta ao usuário \cite{faria_java_ee_7_jsf_primefaces_cdi}.

\par Por possuir as vantagens descritas acima e possuir uma simples configuração, além de ser um \textit{framework cross-browser\footnotemark[15]}, este \textit{framework} foi escolhido para auxiliar no desenvolvimento das páginas \textit{web} deste projeto.

\footnotetext[15]{\textit{Cross-Browser} - Compatibilidade com todos os tipos de dispositivos e navegadores}

\subsection{Primefaces}

\par O Primefaces é uma biblioteca de componentes que implementa a especificação do JSF e deve ser utilizada em conjunto com o mesmo a partir da versão 2.0. Ele possui uma ampla gama de componentes disponíveis para auxiliar o desenvolvimento de interfaces \textit{web} ricas, além de possuir o seu código fonte aberto \cite{ross_borsoi_uso_primefaces}.

\par Segundo \citeonline{juneau_primefaces_enterprise}, uma das grandes vantagens do Primefaces é a facilidade de integração entre ele e o JSF, bastando apenas incluir a biblioteca do Primefaces no projeto JSF. Salvo alguns componentes específicos, como o \textit{file upload} que necessita de pequenas configurações adicionais. Estas mudanças, quando necessárias, devem ser realizadas no arquivo de configuração da aplicação, por padrão ao criar um projeto este arquivo é chamado de \textit{web.xml}, porém, o mesmo pode ser alterado pelo desenvolvedor.

\par Por todas as vantagens mencionadas acima, somado ao fato desta biblioteca possuir uma ótima documentação, em conjunto com uma grande comunidade de desenvolvedores que a utilizam e a alta demanda de desenvolvedores que a conhecem no Mercado, esta foi escolhida em conjunto com o JSF para desenvolver as páginas \textit{web} deste projeto.




%\par Exemplo de parágrafo utilizando comando para formatar em itálico as palavras em inglês, como por exemplo: \textit{pets, animals and software} e um exemplo de texto em negrigo: \textbf{grafo}.

%\par Um tipo de citação: segundo \citeonline{correa2003plantas} as plantas \ldots.

%\par Outro tipo de citação: as plantas \ldots \cite{correa2003plantas}.

%\par Outro tipo de citação com página: \cite[p. 13]{correa2003plantas}.
%\par Outro tipo ainda de citação com página:  \citeonline[p. 13]{correa2003plantas}.

%\par Para referenciar seções e capítulos, é necessário colocar o \textbackslash label e a referência assim: na \autoref{sec:materiais} e no \autoref{cap:quadroMetodologico} são encontradas as informações\ldots

%\par Exemplo de equação:



%\par Outra fórmula: $y=x^2$